home *** CD-ROM | disk | FTP | other *** search
- /*
- * @(#)ISAPIConnection.cpp 1.9 97/05/11
- *
- * Copyright (c) 1995-1997 Sun Microsystems, Inc. All Rights Reserved.
- *
- * This software is the confidential and proprietary information of Sun
- * Microsystems, Inc. ("Confidential Information"). You shall not
- * disclose such Confidential Information and shall use it only in
- * accordance with the terms of the license agreement you entered into
- * with Sun.
- *
- * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
- * SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
- * PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
- * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
- * THIS SOFTWARE OR ITS DERIVATIVES.
- *
- * CopyrightVersion 1.0
- */
-
-
- /*
- * These are the JNI native method implementation for ISAPIConnection
- *
- * @version 1.9, 05/11/97
- * @author Jongyoon Lee
- */
-
- #include <jni.h>
- #include <stdio.h>
- #include <HttpExt.h>
- #include "sun_servlet_isapi_ISAPIConnection.h"
-
-
- /*
- * Helper function to retrieve ECB pointer from Java class
- */
- EXTENSION_CONTROL_BLOCK *getECB(JNIEnv *env, jobject obj) {
-
- jclass cls = env->GetObjectClass(obj);
-
- // long ecb
- jfieldID fid = env->GetFieldID(cls, "ecb", "J");
- if (fid == 0) {
- return NULL;
- }
-
- // cast the long pointer
- return (LPEXTENSION_CONTROL_BLOCK) env->GetLongField(obj, fid);
-
- }
-
- /*
- * Class: sun_servlet_isapi_ISAPIConnection
- * Method: setStatusCode
- * Signature: (J)V
- */
- JNIEXPORT void JNICALL Java_sun_servlet_isapi_ISAPIConnection_setStatusCode
- (JNIEnv *env, jobject obj, jlong status) {
-
- EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
- ecb->dwHttpStatusCode = (DWORD) status;
- }
-
- /*
- * Class: sun_servlet_isapi_ISAPIConnection
- * Method: getMethod
- * Signature: ()Ljava/lang/String;
- */
- JNIEXPORT jstring JNICALL Java_sun_servlet_isapi_ISAPIConnection_getMethod
- (JNIEnv *env, jobject obj) {
-
- EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
- return env->NewStringUTF(ecb->lpszMethod);
- }
-
- /*
- * Class: sun_servlet_isapi_ISAPIConnection
- * Method: getQueryString
- * Signature: ()Ljava/lang/String;
- */
- JNIEXPORT jstring JNICALL Java_sun_servlet_isapi_ISAPIConnection_getQueryString
- (JNIEnv *env, jobject obj) {
-
- EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
- return env->NewStringUTF(ecb->lpszQueryString);
- }
-
- /*
- * Class: sun_servlet_isapi_ISAPIConnection
- * Method: getPathInfo
- * Signature: ()Ljava/lang/String;
- */
- JNIEXPORT jstring JNICALL Java_sun_servlet_isapi_ISAPIConnection_getPathInfo
- (JNIEnv *env, jobject obj) {
-
- EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
- return env->NewStringUTF(ecb->lpszPathInfo);
-
- }
-
- /*
- * Class: sun_servlet_isapi_ISAPIConnection
- * Method: getPathTranslated
- * Signature: ()Ljava/lang/String;
- */
- JNIEXPORT jstring JNICALL Java_sun_servlet_isapi_ISAPIConnection_getPathTranslated
- (JNIEnv *env, jobject obj) {
-
- EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
- return env->NewStringUTF(ecb->lpszPathTranslated);
- }
-
- /*
- * Class: sun_servlet_isapi_ISAPIConnection
- * Method: getContentType
- * Signature: ()Ljava/lang/String;
- */
- JNIEXPORT jstring JNICALL Java_sun_servlet_isapi_ISAPIConnection_getContentType
- (JNIEnv *env, jobject obj) {
-
- EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
- return env->NewStringUTF(ecb->lpszContentType);
- }
-
- /*
- * Class: sun_servlet_isapi_ISAPIConnection
- * Method: getRealPath
- * Signature: (Ljava/lang/String;)Ljava/lang/String;
- */
- JNIEXPORT jstring JNICALL Java_sun_servlet_isapi_ISAPIConnection_getRealPath
- (JNIEnv *env, jobject obj, jstring vpath) {
-
- EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
- char buf[256];
- unsigned long len = 256;
- const char *keybuf = env->GetStringUTFChars(vpath, 0);
- memset(buf, 0, 256);
- strcpy(buf, keybuf);
-
- // release the UTF buffer
- env->ReleaseStringUTFChars(vpath, keybuf);
-
- // get the real path
- ecb->ServerSupportFunction(ecb->ConnID,
- HSE_REQ_MAP_URL_TO_PATH,
- buf,
- &len,
- &len);
-
- return env->NewStringUTF(buf);
- }
-
- /*
- * Class: sun_servlet_isapi_ISAPIConnection
- * Method: getServerVariable
- * Signature: (Ljava/lang/String;)Ljava/lang/String;
- */
- JNIEXPORT jstring JNICALL Java_sun_servlet_isapi_ISAPIConnection_getServerVariable
- (JNIEnv *env, jobject obj, jstring key) {
-
- EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
- char valbuf[256];
- unsigned long len = 256;
- const char *keybuf = env->GetStringUTFChars(key, 0);
- memset(valbuf, 0, 256);
-
- // get the variable
- ecb->GetServerVariable(ecb->ConnID, (char *)keybuf, valbuf, &len);
-
- // release the UTF buffer
- env->ReleaseStringUTFChars(key, keybuf);
- return env->NewStringUTF(valbuf);
- }
-
- /*
- * Class: sun_servlet_isapi_ISAPIConnection
- * Method: sendRedirect
- * Signature: (Ljava/lang/String;)V
- */
- JNIEXPORT void JNICALL Java_sun_servlet_isapi_ISAPIConnection_sendRedirect
- (JNIEnv *env, jobject obj, jstring url) {
-
- EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
- const char *urlbuf = env->GetStringUTFChars(url, 0);
- unsigned long len = strlen(urlbuf);
-
- // send the redirect
- ecb->ServerSupportFunction(ecb->ConnID,
- HSE_REQ_SEND_URL,
- (LPVOID)urlbuf,
- &len,
- &len);
-
- // release the UTF buffer
- env->ReleaseStringUTFChars(url, urlbuf);
- }
-
- /*
- * Class: sun_servlet_isapi_ISAPIConnection
- * Method: getData
- * Signature: (J[BJJ)J
- */
- JNIEXPORT jlong JNICALL Java_sun_servlet_isapi_ISAPIConnection_getData
- (JNIEnv *env, jobject obj, jlong start, jbyteArray buf, jlong off, jlong blen) {
-
- EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
- unsigned long len = ((unsigned long) blen < ecb->cbAvailable) ?
- (unsigned long)blen : ecb->cbAvailable;
- env->SetByteArrayRegion(buf, (long) off, len,
- (jbyte *)(ecb->lpbData + start));
- return len;
- }
-
- /*
- * Class: sun_servlet_isapi_ISAPIConnection
- * Method: writeHeaders
- * Signature: ([BJJ)V
- */
- JNIEXPORT void JNICALL Java_sun_servlet_isapi_ISAPIConnection_writeHeaders
- (JNIEnv *env, jobject obj, jbyteArray status, jlong soff, jlong slen,
- jbyteArray headers, jlong hoff, jlong hlen) {
-
- EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
- byte *statbuf = NULL, *headerbuf = NULL;
- unsigned long len = (unsigned long) hlen;
-
- if (slen != 0) {
- statbuf = (byte *) malloc((unsigned int) slen + 10);
- memset(statbuf, 0, (int) slen + 10);
- env->GetByteArrayRegion(status,
- (long) soff,
- (long) slen,
- (jbyte *) statbuf);
- }
- if (hlen != 0) {
- headerbuf = (byte *) malloc((unsigned int) hlen + 10);
- memset(headerbuf, 0, (int) hlen + 10);
- env->GetByteArrayRegion(headers,
- (long) hoff,
- (long) hlen,
- (jbyte *) headerbuf);
- }
- ecb->ServerSupportFunction(ecb->ConnID,
- HSE_REQ_SEND_RESPONSE_HEADER,
- statbuf,
- &len,
- (LPDWORD) headerbuf);
-
- if (statbuf != NULL) {
- free(statbuf);
- }
- if (headerbuf != NULL) {
- free(headerbuf);
- }
- }
-
- /*
- * Class: sun_servlet_isapi_ISAPIConnection
- * Method: readClient
- * Signature: ([BJJ)J
- */
- JNIEXPORT jlong JNICALL Java_sun_servlet_isapi_ISAPIConnection_readClient
- (JNIEnv *env, jobject obj, jbyteArray b, jlong off, jlong len) {
-
- EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
- byte *buf = (byte *) malloc((unsigned int) len + 10);
- //memset(buf, 0, (int) len + 10);
- unsigned long retlen = (unsigned long) len;
- ecb->ReadClient(ecb->ConnID, buf, &retlen);
- env->SetByteArrayRegion(b, (long) off, retlen, (jbyte *)buf);
-
- free(buf);
- return retlen;
- }
-
- /*
- * Class: sun_servlet_isapi_ISAPIConnection
- * Method: writeClient
- * Signature: ([BJJ)V
- */
- JNIEXPORT void JNICALL Java_sun_servlet_isapi_ISAPIConnection_writeClient
- (JNIEnv *env, jobject obj, jbyteArray b, jlong off, jlong len) {
-
- EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
- byte *buf = (byte *) malloc((unsigned int) len + 10);
- memset(buf, 0, (int) len + 10);
- unsigned long retlen = (unsigned long) len;
- env->GetByteArrayRegion(b, (long) off, (long) len, (jbyte *)buf);
- ecb->WriteClient(ecb->ConnID, buf, &retlen, HSE_IO_SYNC);
- // check if retlen is really len, and wrote everything out
-
- free(buf);
- }
-
- /*
- * Class: sun_servlet_isapi_ISAPIConnection
- * Method: finish
- * Signature: ()V
- */
- JNIEXPORT void JNICALL Java_sun_servlet_isapi_ISAPIConnection_finish
- (JNIEnv *env, jobject obj) {
-
- EXTENSION_CONTROL_BLOCK *ecb = getECB(env, obj);
- ecb->ServerSupportFunction(ecb->ConnID,
- HSE_REQ_DONE_WITH_SESSION,
- (LPVOID) NULL,
- (LPDWORD) NULL,
- (LPDWORD) NULL);
- }
-